perm filename SHAPE.SAI[PIC,HE] blob
sn#430350 filedate 1979-04-04 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 ENTRY GETBDR,STOBDR,SHPROPS,shape,RECONSTRUCT
C00012 ENDMK
C⊗;
ENTRY GETBDR,STOBDR,SHPROPS,shape,RECONSTRUCT;
BEGIN "shape"
REQUIRE "36A" COMPILER!SWITCHES;
REQUIRE "VISLIB" SOURCE!FILE;
source!v(extitm);
external integer itemvar tbdrlen,tshapes,ilocv,jlocv;
EXTERNAL INTEGER MODIFIED;
require "⊂⊃<>" delimiters;
define notiming=⊂TRUE⊃;
source!l(saitim);
own integer inittsh;
SIMPLE PROCEDURE SHAPEINIT;
BEGIN
IF INITTSH THEN RETURN;
tshapes←dcrepro("TSHAPES",9,0);
ilocv←dcrepro("ILOCV",2,0);
jlocv←dcrepro("JLOCV",2,0);
tbdrlen←dcrepro("TBDRLEN",2,0);
inittsh←-1;
end;
simple internal integer procedure getbdr(string itemvar reg; integer bigmsk);
begin "getbdr"
integer itemvar x1;
if tbdrlen ⊗ reg ≡ BIND x1
THEN BEGIN
if props(x1) then modified←props(x1);
if bigmsk
then return(lhalf(<datum(x1)>))
else return(rhalf(<datum(x1)>))
end
else return(0);
end "getbdr";
simple internal procedure stobdr(string itemvar reg; integer bigmsk, bdrl);
begin "stobdr"
integer itemvar x1;
if tbdrlen ⊗ reg ≡ BIND x1
then if bigmsk
then datum(x1)←(bdrl LSH 18) LOR rhalf(<datum(x1)>)
else datum(x1)←(lhalf(<datum(x1)>) LSH 18) LOR bdrl
else dwrite(tbdrlen,reg,dnew(if bigmsk then (bdrl LSH 18) else BDRL));
end "stobdr";
simple internal integer procedure shprops(string itemvar reg;safe real array an,thn,bn,psin);
begin "shprops"
safe real array itemvar raiv;
integer size1,i;
shapeinit;
if ¬(tshapes ⊗ reg ≡ BIND raiv) then return(-1);
size1←arrinfo(datum(raiv),2);
for i←1 thru size1 do
begin
an[i-1]←datum(raiv)[i,1];
thn[i-1]←datum(raiv)[i,2];
bn[i-1]←datum(raiv)[i,3];
psin[i-1]←datum(raiv)[i,4];
end;
return(0);
end "shprops";
INTERNAL integer PROCEDURE shape(string itemvar reg; INTEGER numharm,bigmsk; safe real array an,thn,gamn,bn,psin,deln; integer force);
BEGINtim(shapeFOLLOW,
<SAFE INTEGER ARRAY NEIGHBORS[0:7];
safe real array axn,bxn,ayn,byn[0:numharm];
INTEGER REGNUM,M,N,INITI,INITJ,P,OLDVAL,RWS,COLS,I,J,ST,TEMP,numpt,val,offi,offj,ptnum,ind,ibuf,flag;
string itemvar mname;
integer itemvar x1;
string maskn;
real pi2m,pi2mk,ttrig,tang,xs,ys;>)
if force=0 then if shprops(reg,an,thn,bn,psin)=0 then blreturnit(-1);
shapeinit;
if dmask ⊗ reg ≡ BIND mname
then begin
indmp(getdev(maskn←datum(mname),if bigmsk then "BIG" else "MSK"),maskn,ibuf←fndbuf,flag←-2);
if flag then blreturnit(0);
end
else blreturnit(0);
RWS←ROWS(IBUF); COLS←COLMS(IBUF);
uptoval(i←1,j←1,1,ibuf);
initi←i; initj←j;
ST←0;
offi←isubst(ibuf);
offj←jsubst(ibuf);
if ¬(ilocv ⊗ reg ≡ BIND x1) then dwrite(ilocv,reg,dnew((offi LSH 18) LOR (rws+offi-1)));
if ¬(jlocv ⊗ reg ≡ BIND x1) then dwrite(jlocv,reg,dnew((offj LSH 18) LOR (cols+offj-1)));
if (numpt←getbdr(reg,bigmsk))=0
then begintim(first follow)
numpt←0;
BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS);
WHILE TRUE DO
BEGIN "loop"
TEMP←(N+ST) MOD 8;
I←I+ICASEV(TEMP);
J←J+JCASEV(TEMP);
numpt←numpt+1;
IF I=INITI AND J=INITJ THEN done "loop";
BDRPOST(N,ST,TEMP,I,J,IBUF,RWS,COLS,NEIGHBORS);
END "loop";
stobdr(reg,bigmsk,numpt);
endtim(first follow)
else ;
! do it again to get the Fourier Xform stuff;
begintim(Calculate terms)
begintim(Actual terms)
arrclr(axn); arrclr(bxn);
arrclr(ayn); arrclr(byn);
pi2m←3.1415927*2.0/numpt;
endtim(Actual terms);
ptnum←ST←0;
i←initi; j←initj;
BDRPRE(N,I,J,IBUF,RWS,COLS,NEIGHBORS);
WHILE TRUE DO
BEGIN "loop2"
TEMP←(N+ST) MOD 8;
I←I+ICASEV(TEMP);
J←J+JCASEV(TEMP);
! here goes the computations;
begintim(Actual terms)
ptnum←ptnum+1;
pi2mk←pi2m*ptnum;
for ind←0 thru numharm do
begin
axn[ind]←axn[ind]+i*(ttrig←cos(tang←(pi2mk*ind)));
ayn[ind]←ayn[ind]+j*ttrig;
bxn[ind]←bxn[ind]+i*(ttrig←sin(tang));
byn[ind]←byn[ind]+j*ttrig;
end;
endtim(Actual terms);
IF I=INITI AND J=INITJ THEN done "loop2";
BDRPOST(N,ST,TEMP,I,J,IBUF,RWS,COLS,NEIGHBORS);
END "loop2";
! now get the final computations;
begintim(Actual terms)
gamn[0]←an[0]←axn[0]/numpt;
deln[0]←bn[0]←ayn[0]/numpt;
thn[0]←atan(bxn[0]/axn[0]);
psin[0]←atan(byn[0]/ayn[0]);
for ind←1 thru numharm do
begin
pi2m←3.1415927*ind;
ttrig←sin(tang←(pi2m/numpt));
pi2m←2.0/pi2m;
an[ind]←pi2m*ttrig*sqrt(axn[ind]*axn[ind]+bxn[ind]*bxn[ind]);
bn[ind]←pi2m*ttrig*sqrt(ayn[ind]*ayn[ind]+byn[ind]*byn[ind]);
thn[ind]←atan2(bxn[ind],axn[ind])-tang;
psin[ind]←atan2(byn[ind],ayn[ind])-tang;
end;
endtim(Actual terms);
endtim(Calculate terms);
begin "add relations"
safe real array rarr[1:numharm+1,1:4];
for i←0 thru numharm do
begin
rarr[i+1,1]←an[i];
rarr[i+1,2]←thn[i];
rarr[i+1,3]←bn[i];
rarr[i+1,4]←psin[i];
end;
dwrite(tshapes,reg,dnew(rarr));
end "add relations";
frebuf(ibuf);
blreturnit(numpt);
endtim(shapeFOLLOW);
SIMPLE internal integer procedure reconstruct(string itemvar reg; integer numharm; safe real array an,thn,gamn,bn,psin,deln);
begintim(reconstruct,
<integer nbuf,i,n,rws,col,numpt;
integer itemvar x1,x2;
real xs,ys,pi2m,tang;>)
SHAPEINIT;
if ¬(ilocv ⊗ reg ≡ BIND X1) then blreturnit(-1);
if ¬(jlocv ⊗ reg ≡ BIND X2) then blreturnit(-1);
if shprops(reg,an,thn,bn,psin) then blreturnit(-1);
getbuf(rws←(rhalf(<datum(x1)>)-lhalf(<datum(x1)>)+1),col←(rhalf(<datum(x2)>)-lhalf(<datum(x2)>)+1),1,nbuf←fndbuf);
putsub(lhalf(<datum(x1)>),lhalf(<datum(x2)>),nbuf);
if (tbdrlen ⊗ reg ≡ BIND x1) then numpt←lhalf(<datum(x1)>);
for i←1 thru numpt do
begin
xs←an[0];
ys←bn[0];
pi2m←3.1415927*2*i/numpt;
for n←1 thru numharm do
begin
xs←xs+an[n]*cos((tang←(pi2m*n))-thn[n]);
ys←ys+bn[n]*cos(tang-psin[n]);
end;
putpnt((xs MAX 1) MIN rws,(ys MAX 1) MIN col,-1,nbuf);
end;
blreturnit(nbuf);
endtim(reconstruct);
END "shape"